package itheima.translatePlus;

 class MortonCode {

    // 使用位运算的高效实现
    public static String encode(int row, int col) {
        long morton = 0;

        // 交错位：经典的莫顿码算法
        for (int i = 0; i < 16; i++) { // 支持最多16位，可调整
            morton |= ((col & (1L << i)) << i) | ((row & (1L << i)) << (i + 1));
        }

        return Long.toBinaryString(morton);
    }

    // 更高效的解码实现
    public static int[] decode(String mortonCode) {
        long morton = Long.parseLong(mortonCode, 2);

        int row = 0;
        int col = 0;

        // 分离交错位
        for (int i = 0; i < 32; i++) {
            long mask = 1L << (2 * i);
            if ((morton & mask) != 0) {
                col |= (1 << i);
            }

            mask = 1L << (2 * i + 1);
            if ((morton & mask) != 0) {
                row |= (1 << i);
            }
        }

        return new int[]{row, col};
    }

    // 纯位运算版本（最快）
    public static long encodeBitwise(int x, int y) {
        // x是指列，y表示行，跟地理坐标轴是一致的
        long result = 0;
        for (int i = 0; i < 32; i++) {
            result |= ((x & (1L << i)) << i) | ((y & (1L << i)) << (i + 1));
        }
        return result;
    }

    public static int[] decodeBitwise(long morton) {
        // x指列，y表示行
        int x = 0, y = 0;
        for (int i = 0; i < 32; i++) {
            y |= (morton & (1L << (2 * i + 1))) >> (i + 1);
            x |= (morton & (1L << (2 * i))) >> i;
        }
        return new int[]{x, y};
    }
}

